package offer.offer03;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * sort传进去一个新的Comparator看看。
 */
public class S45把数组排成最小的数 {
    /**
     * 首先去掉0, 然后每次先加的数必然是首位最小的, 然后比较后面的位数
     * 就是有的场景, 比如3, 33, 谁放在前面和其他的数有关, 比较难判断。
     */
    public String minNumber(int[] nums) {
        List<Integer> numsList = Arrays.stream(nums).boxed().collect(Collectors.toList());
        //用一下lambda试试
//        numsList.stream().sorted((a, b)->{
//            while(a / 10 != 0) a = a/10;
//            while(b / 10 != 0) b = b/10;
//
//            return 0;
//        });

        return null;
    }

    /**
     * 6, 用sort代替, 但是并不能直接sort, 因为3和30, 实际上30应该排在3前面, 但是直接sort3会在30前面。
     * 所以我这里用两者先拼接, 再比较两种拼接结果大小。
     * 但是很慢。
     */
    public String minNumber2(int[] nums) {
        int totalLen = nums.length;
        List<String> numsList = new ArrayList<>();
        for (int num : nums) {
            numsList.add("" + num);
        }
        numsList.sort((String x, String y) -> (int) (Long.parseLong(x + y) - Long.parseLong(y + x)));
        // System.out.println(numsList);
        String tempRes = numsList.toString();
        return tempRes.substring(1, tempRes.length() - 1).replaceAll(", ", "");
    }

    /**
     * 别人的方法, 对, 拼接起来的String单纯比较就可以了。
     */
    public String minNumber3(int[] nums) {
        return IntStream.of(nums).mapToObj(String::valueOf).sorted(((o1, o2) -> (o1 + o2).compareTo(o2 + o1))).collect(Collectors.joining());
    }
}
